package com.auntvt.timo.jpax.core.service;

import com.auntvt.timo.jpax.core.quick.interfaces.QuickSpecification;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.lang.Nullable;

import java.util.List;
import java.util.Optional;

/**
 * 整合Quick快速查询接口
 *
 * @author 小懒虫 <auntvt@163.com>
 * @date 2021/7/31
 */
public interface QuickService<T> {

    /**
     * 根据Quick查询实例条件获取数据
     *
     * @param quickSpecification Quick查询实例
     * @return 实体类对象
     */
    T get(@Nullable QuickSpecification<T> quickSpecification);

    /**
     * 根据Quick查询实例条件获取数据
     *
     * @param quickSpecification Quick查询实例
     * @return Optional对象
     */
    Optional<T> getOptional(QuickSpecification<T> quickSpecification);

    /**
     * 根据Quick查询实例条件获取数据
     *
     * @param quickSpecification Quick查询实例
     * @return 列表数据
     */
    List<T> lists(@Nullable QuickSpecification<T> quickSpecification);

    /**
     * 根据Quick查询实例条件获取数据，并且进行排序
     *
     * @param quickSpecification Quick查询实例
     * @param sort               排序对象
     * @return 列表数据
     */
    List<T> lists(@Nullable QuickSpecification<T> quickSpecification, Sort sort);

    /**
     * 根据Quick查询实例条件获取数据，并且进行分页
     *
     * @param quickSpecification Quick查询实例
     * @param pageable           分页配置对象
     * @return 分页数据
     */
    Page<T> pages(@Nullable QuickSpecification<T> quickSpecification, Pageable pageable);

    /**
     * 根据Quick查询实例条件统计个数
     *
     * @param quickSpecification Quick查询实例
     * @return 数量
     */
    long count(@Nullable QuickSpecification<T> quickSpecification);
}
